/**
 * @file DataIndex.hpp
 * @brief
 * 该文件类型存储文件帧号和图片数据为单独的两份文件然后保存在指定文件夹中
 * @note
 * 将根据路径创建文件夹
 * 文件`index`
 * ***示例***
 * ```
 * 1920
 * 1080
 * 1
 * 1
 * 2
 * 3
 * 4
 * ```
 * ***结构描述***
 * 行号 | 名称 | 类型 
 * ---- | ---- | ----
 * 1 | 图片宽度 | unsigned
 * 2 | 图片高度 | unsigned
 * 3 | 单像素大小 | unsigned
 * ... | 帧号 | unsigned
 * 文件`data`
 * ***示例***
 * ```
 * [binary Image1]
 * [binary Image2]
 * ```
 * ***结构描述***
 * 由一系列的原始图片像素流构成
 * 每张图片的大小为=图片宽度*图片高度*单像素大小
 * 图片的位置由`index`文件指示
 */

#ifndef DATA_INDEX_H
#define DATA_INDEX_H

#include "BaseFormat.hpp"
#include <fstream>

/**
 * @class DataIndex
 * @brief 将图片数据流保存成两份文件
 */
class DataIndex : public BaseFormat
{
  private:
    /**
     * @brief 'Index'文件写入对象
     */
    std::ofstream oIndex;
    /**
     * @brief 'Data'文件写入对象
     */
    std::ofstream oData;
  public:
    /**
     * @brief 构造函数
     */
    DataIndex()=default;
    /**
     * @brief 析构函数
     */
    virtual ~DataIndex();
    /**
     * @brief 开始记录
     * @note 具体实现参见`BaseFormat`
     *
     * @param savepath 
     * @param additional 
     */
    virtual void Start(const std::filesystem::path& savepath,const BaseFormatAdditionalInf& additional) override final;
    /**
     * @brief 写入数据
     * @note 具体实现参见`BaseFormat`
     *
     * @param image 
     */
    virtual void FileSaveFuncCall(const ImageType& image) override final;
    /**
     * @brief 停止记录
     * @note 具体实现参见`BaseFormat`
     */
    virtual void Stop() override final;
};

#endif
